home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / pc / BOBOLI.ZIP / SRC / UMK.C < prev    next >
Encoding:
C/C++ Source or Header  |  1996-04-27  |  46.3 KB  |  2,181 lines

  1. #include "umk.h"
  2. #include "mgraph.h"
  3. #include <stdlib.h>
  4. #include <stdio.h>
  5.  
  6. static unsigned long umk_xmin,umk_xmax;
  7. static unsigned long umk_src,umk_dst,umk_caddr;
  8. static byte umk_wid,umk_hgt,umk_data;
  9. static byte umk_flag;
  10.  
  11. void umk_free(umkset u)
  12. {
  13.   byte i;
  14.   if(u[0].img!=NULL) free(u[0].img);
  15.   u[0].img=NULL;
  16. }
  17.  
  18. int umk_load(char *name,umkset u)
  19. {
  20.   FILE *f;
  21.   unsigned long amt,pos;
  22.   byte count;
  23.   int i;
  24.   f=fopen(name,"rb");
  25.   /* if file doesn't exist, fail */
  26.   if(f==NULL) return -1;
  27.   fseek(f,0,SEEK_END);
  28.   amt=ftell(f);
  29.   fseek(f,0,SEEK_SET);
  30.   fread(&count,1,1,f);
  31.   /* if unable to allocate memory, fail */
  32.   if(!(u[0].img=malloc(amt))) {
  33.     fclose(f);
  34.     return -1;
  35.   }
  36.   pos=0;
  37.   for(i=0;i<count;i++) {
  38.     u[i].img=(byte *)(u[0].img+pos);
  39.     fread(&u[i].width,1,2,f);
  40.     fread(&u[i].height,1,2,f);
  41.     fread(&u[i].size,1,2,f);
  42.     fread(u[i].img,1,u[i].size,f);
  43.     pos+=u[i].size;
  44.   }
  45.   fclose(f);
  46.   initmg();
  47.   return 0;
  48. }
  49.  
  50. int mat_load(char *name,colmat c)
  51. {
  52.   FILE *f;
  53.   if(!(f=fopen(name,"rb"))) return -1;
  54.   fread(c,1,sizeof(colmat),f);
  55.   fclose(f);
  56.   return 0;
  57. }
  58.  
  59. void umk_draw(int x,int y,umkrec u,scrntype scrn)
  60. {
  61.   if(y>199) return;
  62.   if(y<=-u.height) return;
  63.   if(x<=-u.width) return;
  64.   if(x>319) return;
  65.   umk_src=(long)u.img;
  66.   umk_dst=(long)scrn+x+y*320;
  67.   umk_xmin=(long)scrn+y*320;
  68.   if(y<0) {
  69.     umk_xmin=(long)scrn;
  70.     umk_flag=-y;
  71.   } else umk_flag=0;
  72.   umk_xmax=umk_xmin+319;
  73.   umk_wid=u.width;
  74.   umk_hgt=u.height;
  75.   if(y>200-u.height) umk_hgt=200-y;
  76.   asm("pusha
  77.        push %ds
  78.        pop  %es
  79.        movl _umk_src,%esi
  80.        movl _umk_dst,%edi
  81.        movb _umk_wid,%dl
  82.        movb _umk_hgt,%dh
  83.        xorl %eax,%eax
  84.        xorl %ecx,%ecx
  85. loop1:
  86.        cmpb $0,%dl
  87.        jz   linedone
  88.        movb %ds:(%esi),%al
  89.        incl %esi
  90.        cmpb $0,%al
  91.        jnz  nonzero
  92.        movb %ds:(%esi),%al
  93.        incl %esi
  94.        subb %al,%dl
  95.        addl %eax,%edi
  96.        jmp  loop1
  97. nonzero:
  98.        cmpl _umk_xmax,%edi
  99.        ja   dontplot
  100.        cmpl _umk_xmin,%edi
  101.        jb   dontplot
  102.        cmpb $0,_umk_flag
  103.        jnz  dontplot
  104.        movb %al,%es:(%edi)
  105. dontplot:
  106.        incl %edi
  107.        decb %dl
  108.        jmp  loop1
  109. linedone:
  110.        decb %dh
  111.        jz   done
  112.        movb _umk_wid,%al
  113.        movw $320,%cx
  114.        subw %ax,%cx
  115.        addl %ecx,%edi
  116.        movb %al,%dl
  117.        cmpb $0,_umk_flag
  118.        jnz  bfhandle
  119.        addl $320,_umk_xmin
  120.        addl $320,_umk_xmax
  121.        jmp  loop1
  122. bfhandle:
  123.        decb _umk_flag
  124.        jmp  loop1
  125. done:
  126.        popa");
  127. }
  128.  
  129. void umk_255draw(int x,int y,byte c,umkrec u,scrntype scrn)
  130. {
  131.   if(y>199) return;
  132.   if(y<=-u.height) return;
  133.   if(x<=-u.width) return;
  134.   if(x>319) return;
  135.   umk_src=(long)u.img;
  136.   umk_dst=(long)scrn+x+y*320;
  137.   umk_xmin=(long)scrn+y*320;
  138.   if(y<0) {
  139.     umk_xmin=(long)scrn;
  140.     umk_flag=-y;
  141.   } else umk_flag=0;
  142.   umk_xmax=umk_xmin+319;
  143.   umk_wid=u.width;
  144.   umk_hgt=u.height;
  145.   umk_data=c;
  146.   if(y>200-u.height) umk_hgt=200-y;
  147.   asm("pusha
  148.        push %ds
  149.        pop  %es
  150.        movl _umk_src,%esi
  151.        movl _umk_dst,%edi
  152.        movb _umk_wid,%dl
  153.        movb _umk_hgt,%dh
  154.        xorl %eax,%eax
  155.        xorl %ecx,%ecx
  156. tloop1:
  157.        cmpb $0,%dl
  158.        jz   tlinedone
  159.        movb %ds:(%esi),%al
  160.        incl %esi
  161.        cmpb $0,%al
  162.        jnz  tnonzero
  163.        movb %ds:(%esi),%al
  164.        incl %esi
  165.        subb %al,%dl
  166.        addl %eax,%edi
  167.        jmp  tloop1
  168. tnonzero:
  169.        cmpl _umk_xmax,%edi
  170.        ja   tdontplot
  171.        cmpl _umk_xmin,%edi
  172.        jb   tdontplot
  173.        cmpb $0,_umk_flag
  174.        jnz  tdontplot
  175.        cmpb $255,%al
  176.        jne  tplotit
  177.        movb _umk_data,%al
  178. tplotit:
  179.        movb %al,%es:(%edi)
  180. tdontplot:
  181.        incl %edi
  182.        decb %dl
  183.        jmp  tloop1
  184. tlinedone:
  185.        decb %dh
  186.        jz   tdone
  187.        movb _umk_wid,%al
  188.        movw $320,%cx
  189.        subw %ax,%cx
  190.        addl %ecx,%edi
  191.        movb %al,%dl
  192.        cmpb $0,_umk_flag
  193.        jnz  tbfhandle
  194.        addl $320,_umk_xmin
  195.        addl $320,_umk_xmax
  196.        jmp  tloop1
  197. tbfhandle:
  198.        decb _umk_flag
  199.        jmp  tloop1
  200. tdone:
  201.        popa");
  202. }
  203.  
  204.  
  205. void umk_solid(int x,int y,byte col,umkrec u,scrntype scrn)
  206. {
  207.   if(y>199) return;
  208.   if(y<=-u.height) return;
  209.   if(x<=-u.width) return;
  210.   if(x>319) return;
  211.   umk_src=(long)u.img;
  212.   umk_dst=(long)scrn+x+y*320;
  213.   umk_xmin=(long)scrn+y*320;
  214.   if(y<0) {
  215.     umk_xmin=(long)scrn;
  216.     umk_flag=-y;
  217.   } else umk_flag=0;
  218.   umk_xmax=umk_xmin+319;
  219.   umk_wid=u.width;
  220.   umk_hgt=u.height;
  221.   umk_data=col;
  222.   asm("pusha
  223.        push %ds
  224.        pop  %es
  225.        movl _umk_src,%esi
  226.        movl _umk_dst,%edi
  227.        addl $63999,_umk_dst
  228.        movb _umk_wid,%dl
  229.        movb _umk_hgt,%dh
  230.        movb _umk_data,%bl
  231. sloop1:
  232.        cmpb $0,%dl
  233.        jz slinedone
  234.        movw %ds:(%esi),%ax
  235.        cmpb $0,%al
  236.        jnz snonzero
  237.        xorl %ecx,%ecx
  238.        subb %ah,%dl
  239.        movb %ah,%cl
  240.        addl %ecx,%edi
  241.        incl %esi
  242.        incl %esi
  243.        jmp sloop1
  244. snonzero:
  245.        cmpl _umk_xmax,%edi
  246.        ja sdontplot
  247.        cmpl _umk_xmin,%edi
  248.        jb sdontplot
  249.        cmpb $0,_umk_flag
  250.        jnz sdontplot
  251.        movb %bl,%es:(%edi)
  252. sdontplot:
  253.        incl %esi
  254.        incl %edi
  255.        decb %dl
  256.        jmp sloop1
  257. slinedone:
  258.        decb %dh
  259.        jz sdone
  260.        xorw %ax,%ax
  261.        xorl %ecx,%ecx
  262.        movb _umk_wid,%al
  263.        movw $320,%cx
  264.        subw %ax,%cx
  265.        addl %ecx,%edi
  266.        movb %al,%dl
  267.        cmpb $0,_umk_flag
  268.        jnz sbfhandle
  269.        movl _umk_dst,%ecx
  270.        cmpl %ecx,%edi
  271.        ja sdone
  272.        addl $320,_umk_xmin
  273.        addl $320,_umk_xmax
  274.        cmpl %ecx,_umk_xmax
  275.        jb sloop1
  276.        movl %ecx,_umk_xmax
  277.        jmp sloop1
  278. sbfhandle:
  279.        decb _umk_flag
  280.        jmp sloop1
  281. sdone:
  282.        popa");
  283. }
  284.  
  285. void umk_shadowlimit(rect r,int x,int y,colmat col,umkrec u,scrntype scrn)
  286. {
  287.   long yy;
  288.   if(y>r.y2) return;
  289.   if(y<=r.y-u.height) return;
  290.   if(x<=r.x-u.width) return;
  291.   if(x>r.x2) return;
  292.   yy=(long)scrn+y*320;
  293.   umk_src=(long)u.img;
  294.   umk_dst=x+yy;
  295.   umk_xmin=r.x+yy;
  296.   umk_xmax=r.x2+yy;
  297.   if(y<r.y) {
  298.     yy=(long)scrn+r.y*320;
  299.     umk_xmin=r.x+yy;
  300.     umk_xmax=r.x2+yy;
  301.     umk_flag=r.y-y;
  302.   } else umk_flag=0;
  303.   umk_wid=u.width;
  304.   umk_hgt=u.height;
  305.   if(y>r.y2-u.height) umk_hgt=r.y2-y+1;
  306.   umk_caddr=(long)col;
  307.   asm("pusha
  308.        push %ds
  309.        pop  %es
  310.        movl _umk_src,%esi
  311.        movl _umk_dst,%edi
  312.        movb _umk_wid,%dl
  313.        movb _umk_hgt,%dh
  314.        xorl %ecx,%ecx
  315.        xorl %eax,%eax
  316.        xorw %bx,%bx
  317.        movb _umk_wid,%bl
  318.        movw $320,%cx
  319.        subw %bx,%cx
  320.        movl _umk_caddr,%ebx
  321.        cmpb $0,_umk_flag
  322.        jnz slquickstart
  323. slloop1:
  324.        cmpb $0,%dl
  325.        jz   sllinedone
  326.        movb %ds:(%esi),%al
  327.        cmpb $0,%al
  328.        jnz  slnonzero
  329.        incl %esi
  330.        movb %ds:(%esi),%al
  331.        subb %al,%dl
  332.        addl %eax,%edi
  333.        incl %esi
  334.        jmp  slloop1
  335. slnonzero:
  336.        cmpl _umk_xmax,%edi
  337.        ja   slpastend
  338.        cmpl _umk_xmin,%edi
  339.        jb   sldontplot
  340.        movb %es:(%edi),%al
  341.        movb %ds:(%ebx,%eax),%al
  342.        movb %al,%es:(%edi)
  343. sldontplot:
  344.        incl %esi
  345.        incl %edi
  346.        decb %dl
  347.        jmp  slloop1
  348. slpastend:
  349.        call slquickfinish
  350. sllinedone:
  351.        decb %dh
  352.        jz   sldone
  353.        addl %ecx,%edi
  354.        movb _umk_wid,%dl
  355.        addl $320,_umk_xmin
  356.        addl $320,_umk_xmax
  357.        jmp  slloop1
  358. slqfinish2:
  359.        movb (%esi),%al
  360.        cmpb $0,%al
  361.        jnz  slquickfinish
  362.        incl %esi
  363.        movb (%esi),%al
  364.        decb %al
  365.        addl %eax,%edi
  366.        subb %al,%dl
  367. slquickfinish:
  368.        # this is called when the drawing has hit xmax, so that it will
  369.        # just hurry through the rest of the line
  370.        incl %esi
  371.        incl %edi
  372.        decb %dl
  373.        jnz  slqfinish2
  374.        ret
  375. slquickstart:
  376.        decl %esi
  377.        decl %edi
  378.        incb %dl
  379.        call slquickfinish
  380.        movb _umk_wid,%al
  381.        subl %eax,%edi
  382.        addl $320,%edi
  383.        movb %al,%dl
  384.        decb %dh
  385.        decb _umk_flag
  386.        jnz  slquickstart
  387.        jmp  slloop1
  388. sldone:
  389.        popa");
  390. }
  391.  
  392. void umk_255limit(rect r,int x,int y,byte col,umkrec u,scrntype scrn)
  393. {
  394.   long yy;
  395.   if(y>r.y2) return;
  396.   if(y<=r.y-u.height) return;
  397.   if(x<=r.x-u.width) return;
  398.   if(x>r.x2) return;
  399.   yy=(long)scrn+y*320;
  400.   umk_src=(long)u.img;
  401.   umk_dst=x+yy;
  402.   umk_xmin=r.x+yy;
  403.   umk_xmax=r.x2+yy;
  404.   if(y<r.y) {
  405.     yy=(long)scrn+r.y*320;
  406.     umk_xmin=r.x+yy;
  407.     umk_xmax=r.x2+yy;
  408.     umk_flag=r.y-y;
  409.   } else umk_flag=0;
  410.   umk_wid=u.width;
  411.   umk_hgt=u.height;
  412.   if(y>r.y2-u.height) umk_hgt=r.y2-y+1;
  413.   umk_data=col;
  414.   asm("pusha
  415.        push %ds
  416.        pop  %es
  417.        movl _umk_src,%esi
  418.        movl _umk_dst,%edi
  419.        movb _umk_wid,%dl
  420.        movb _umk_hgt,%dh
  421.        xorl %ecx,%ecx
  422.        xorl %eax,%eax
  423.        movb _umk_wid,%bl
  424.        movw $320,%cx
  425.        subw %bx,%cx
  426.        xorl %ebx,%ebx
  427.        cmpb $0,_umk_flag
  428.        jnz l2quickstart
  429. l2loop1:
  430.        cmpb $0,%dl
  431.        jz l2linedone
  432.        movb %ds:(%esi),%al
  433.        cmpb $0,%al
  434.        jnz  l2nonzero
  435.        incl %esi
  436.        movb %ds:(%esi),%al
  437.        subb %al,%dl
  438.        addl %eax,%edi
  439.        incl %esi
  440.        jmp  l2loop1
  441. l2nonzero:
  442.        cmpl _umk_xmax,%edi
  443.        ja   l2pastend
  444.        cmpl _umk_xmin,%edi
  445.        jb   l2dontplot
  446.        cmpb $255,%al
  447.        je   l2255
  448.        movb %al,%es:(%edi)
  449. l2dontplot:
  450.        incl %esi
  451.        incl %edi
  452.        decb %dl
  453.        jmp  l2loop1
  454. l2255: movb _umk_data,%al
  455.        movb %al,%es:(%edi)
  456.        jmp  l2dontplot
  457. l2pastend:
  458.        call l2quickfinish
  459. l2linedone:
  460.        decb %dh
  461.        jz l2done
  462.        addl %ecx,%edi
  463.        movb _umk_wid,%dl
  464.        addl $320,_umk_xmin
  465.        addl $320,_umk_xmax
  466.        jmp l2loop1
  467. l2qfinish2:
  468.        movb (%esi),%al
  469.        cmpb $0,%al
  470.        jnz l2quickfinish
  471.        incl %esi
  472.        movb (%esi),%al
  473.        decb %al
  474.        addl %eax,%edi
  475.        subb %al,%dl
  476. l2quickfinish:
  477.        # this is called when the drawing has hit xmax, so that it will
  478.        # just hurry through the rest of the line
  479.        incl %esi
  480.        incl %edi
  481.        decb %dl
  482.        jnz l2qfinish2
  483.        ret
  484. l2quickstart:
  485.        decl %esi
  486.        decl %edi
  487.        incb %dl
  488.        call l2quickfinish
  489.        movb _umk_wid,%al
  490.        subl %eax,%edi
  491.        addl $320,%edi
  492.        movb %al,%dl
  493.        decb %dh
  494.        decb _umk_flag
  495.        jnz l2quickstart
  496.        jmp l2loop1
  497. l2done:
  498.        popa");
  499. }
  500.  
  501. void umk_limit(rect r,int x,int y,umkrec u,scrntype scrn)
  502. {
  503.   long yy;
  504.   if(y>r.y2) return;
  505.   if(y<=r.y-u.height) return;
  506.   if(x<=r.x-u.width) return;
  507.   if(x>r.x2) return;
  508.   yy=(long)scrn+y*320;
  509.   umk_src=(long)u.img;
  510.   umk_dst=x+yy;
  511.   umk_xmin=r.x+yy;
  512.   umk_xmax=r.x2+yy;
  513.   if(y<r.y) {
  514.     yy=(long)scrn+r.y*320;
  515.     umk_xmin=r.x+yy;
  516.     umk_xmax=r.x2+yy;
  517.     umk_flag=r.y-y;
  518.   } else umk_flag=0;
  519.   umk_wid=u.width;
  520.   umk_hgt=u.height;
  521.   if(y>r.y2-u.height) umk_hgt=r.y2-y+1;
  522.   asm("pusha
  523.        push %ds
  524.        pop  %es
  525.        movl _umk_src,%esi
  526.        movl _umk_dst,%edi
  527.        movb _umk_wid,%dl
  528.        movb _umk_hgt,%dh
  529.        xorl %ebx,%ebx
  530.        xorl %ecx,%ecx
  531.        xorl %eax,%eax
  532.        cmpb $0,_umk_flag
  533.        jnz lquickstart
  534. lloop1:
  535.        cmpb $0,%dl
  536.        jz llinedone
  537.        movb %ds:(%esi),%al
  538.        cmpb $0,%al
  539.        jnz lnonzero
  540.        incl %esi
  541.        movb %ds:(%esi),%al
  542.        subb %al,%dl
  543.        addl %eax,%edi
  544.        incl %esi
  545.        jmp lloop1
  546. lnonzero:
  547.        cmpl _umk_xmax,%edi
  548.        ja lpastend
  549.        cmpl _umk_xmin,%edi
  550.        jb ldontplot
  551.        movb %al,%es:(%edi)
  552. ldontplot:
  553.        incl %esi
  554.        incl %edi
  555.        decb %dl
  556.        jmp lloop1
  557. lpastend:
  558.        call lquickfinish
  559. llinedone:
  560.        decb %dh
  561.        jz ldone
  562.        movb _umk_wid,%bl
  563.        movw $320,%cx
  564.        subw %bx,%cx
  565.        addl %ecx,%edi
  566.        movb %bl,%dl
  567.        addl $320,_umk_xmin
  568.        addl $320,_umk_xmax
  569.        jmp lloop1
  570. lqfinish2:
  571.        movb (%esi),%al
  572.        cmpb $0,%al
  573.        jnz lquickfinish
  574.        incl %esi
  575.        movb (%esi),%al
  576.        decb %al
  577.        addl %eax,%edi
  578.        subb %al,%dl
  579. lquickfinish:
  580.        # this is called when the drawing has hit xmax, so that it will
  581.        # just hurry through the rest of the line
  582.        incl %esi
  583.        incl %edi
  584.        decb %dl
  585.        jnz lqfinish2
  586.        ret
  587. lquickstart:
  588.        decl %esi
  589.        decl %edi
  590.        incb %dl
  591.        call lquickfinish
  592.        movb _umk_wid,%al
  593.        subl %eax,%edi
  594.        addl $320,%edi
  595.        movb %al,%dl
  596.        decb %dh
  597.        decb _umk_flag
  598.        jnz lquickstart
  599.        jmp lloop1
  600. ldone:
  601.        popa");
  602. }
  603.  
  604. /* draws amt pixels, skips 1, draws amt more */
  605. void umk_partial(int x,int y,byte amt,umkrec u,scrntype scrn)
  606. {
  607.   if(y>199) return;
  608.   if(y<=-u.height) return;
  609.   if(x<=-u.width) return;
  610.   if(x>319) return;
  611.   umk_src=(long)u.img;
  612.   umk_dst=(long)scrn+x+y*320;
  613.   umk_xmin=(long)scrn+y*320;
  614.   if(y<0) {
  615.     umk_xmin=(long)scrn;
  616.     umk_flag=-y;
  617.   } else umk_flag=0;
  618.   umk_xmax=umk_xmin+319;
  619.   umk_wid=u.width;
  620.   umk_hgt=u.height;
  621.   if(y>199-u.height) umk_hgt=200-y;
  622.   umk_data=amt;
  623.   asm("pusha
  624.        push %ds
  625.        pop  %es
  626.        movl _umk_src,%esi
  627.        movl _umk_dst,%edi
  628.        movb _umk_wid,%dl
  629.        movb _umk_hgt,%dh
  630.        movb _umk_data,%bl
  631.        xorl %eax,%eax
  632.        xorl %ecx,%ecx
  633. ploop1:
  634.        cmpb $0,%dl
  635.        jz   plinedone
  636.        movb %ds:(%esi),%al
  637.        cmpb $0,%al
  638.        jnz  pnonzero
  639.        incl %esi
  640.        movb %ds:(%esi),%al
  641.        subb %al,%dl
  642.        addl %eax,%edi
  643.        incl %esi
  644.        jmp  ploop1
  645. pnonzero:
  646.        cmpl _umk_xmax,%edi
  647.        ja   pdontplot2
  648.        cmpl _umk_xmin,%edi
  649.        jb   pdontplot2
  650.        cmpb $0,_umk_flag
  651.        jnz  pdontplot2
  652.        decb %bl
  653.        cmpb $0,%bl
  654.        jz   pdontplot
  655.        movb %al,%es:(%edi)
  656.        incl %esi
  657.        incl %edi
  658.        decb %dl
  659.        jmp  ploop1
  660. pdontplot:
  661.        movb _umk_data,%bl
  662. pdontplot2:
  663.        incl %esi
  664.        incl %edi
  665.        decb %dl
  666.        jmp  ploop1
  667. plinedone:
  668.        decb %dh
  669.        jz   pdone
  670.        movb _umk_wid,%al
  671.        movw $320,%cx
  672.        subw %ax,%cx
  673.        addl %ecx,%edi
  674.        movb %al,%dl
  675.        cmpb $0,_umk_flag
  676.        jnz  pbfhandle
  677.        addl $320,_umk_xmin
  678.        addl $320,_umk_xmax
  679.        jmp  ploop1
  680. pbfhandle:
  681.        decb _umk_flag
  682.        jmp ploop1
  683. pdone:
  684.        popa");
  685. }
  686.  
  687. /* draws 1 pixel, skips amt, draws 1 more */
  688. void umk_unpartial(int x,int y,byte amt,umkrec u,scrntype scrn)
  689. {
  690.   if(y>199) return;
  691.   if(y<=-u.height) return;
  692.   if(x<=-u.width) return;
  693.   if(x>319) return;
  694.   umk_src=(long)u.img;
  695.   umk_dst=(long)scrn+x+y*320;
  696.   umk_xmin=(long)scrn+y*320;
  697.   if(y<0) {
  698.     umk_xmin=(long)scrn;
  699.     umk_flag=-y;
  700.   } else umk_flag=0;
  701.   umk_xmax=umk_xmin+319;
  702.   umk_wid=u.width;
  703.   umk_hgt=u.height;
  704.   if(y>199-u.height) umk_hgt=200-y;
  705.   umk_data=amt;
  706.   asm("pusha
  707.        push %ds
  708.        pop  %es
  709.        movl _umk_src,%esi
  710.        movl _umk_dst,%edi
  711.        movb _umk_wid,%dl
  712.        movb _umk_hgt,%dh
  713.        movb _umk_data,%bl
  714.        xorl %eax,%eax
  715.        xorl %ecx,%ecx
  716. uloop1:
  717.        cmpb $0,%dl
  718.        jz   ulinedone
  719.        movb %ds:(%esi),%al
  720.        cmpb $0,%al
  721.        jnz  unonzero
  722.        incl %esi
  723.        movb %ds:(%esi),%al
  724.        subb %al,%dl
  725.        addl %eax,%edi
  726.        incl %esi
  727.        jmp  uloop1
  728. unonzero:
  729.        decb %bl
  730.        cmpb $0,%bl
  731.        jz   uplot
  732. udontplot:
  733.        incl %esi
  734.        incl %edi
  735.        decb %dl
  736.        jmp  uloop1
  737. uplot:
  738.        cmpl _umk_xmax,%edi
  739.        ja   udontplot
  740.        cmpl _umk_xmin,%edi
  741.        jb   udontplot
  742.        cmpb $0,_umk_flag
  743.        jnz  udontplot
  744.        movb %al,%es:(%edi)
  745.        movb _umk_data,%bl
  746.        incl %esi
  747.        incl %edi
  748.        decb %dl
  749.        jmp  uloop1
  750. ulinedone:
  751.        decb %dh
  752.        jz   udone
  753.        movb _umk_wid,%al
  754.        movw $320,%cx
  755.        subw %ax,%cx
  756.        addl %ecx,%edi
  757.        movb %al,%dl
  758.        cmpb $0,_umk_flag
  759.        jnz  ubfhandle
  760.        addl $320,_umk_xmin
  761.        addl $320,_umk_xmax
  762.        jmp  uloop1
  763. ubfhandle:
  764.        decb _umk_flag
  765.        jmp uloop1
  766. udone:
  767.        popa");
  768. }
  769.  
  770. void umk_colour(int x,int y,byte c,umkrec u,scrntype scrn)
  771. {
  772.   if(y>199) return;
  773.   if(y<=-u.height) return;
  774.   if(x<=-u.width) return;
  775.   if(x>319) return;
  776.   umk_src=(long)u.img;
  777.   umk_dst=(long)scrn+x+y*320;
  778.   umk_xmin=(long)scrn+y*320;
  779.   if(y<0) {
  780.     umk_xmin=(long)scrn;
  781.     umk_flag=-y;
  782.   } else umk_flag=0;
  783.   umk_xmax=umk_xmin+319;
  784.   umk_wid=u.width;
  785.   umk_hgt=u.height;
  786.   if(y>200-u.height) umk_hgt=200-y;
  787.   umk_data=c;
  788.   asm("pusha
  789.        push %ds
  790.        pop  %es
  791.        movl _umk_src,%esi
  792.        movl _umk_dst,%edi
  793.        movb _umk_wid,%dl
  794.        movb _umk_hgt,%dh
  795.        xorl %eax,%eax
  796.        xorl %ecx,%ecx
  797.        mov _umk_data,%bl
  798. cloop1:
  799.        cmpb $0,%dl
  800.        jz clinedone
  801.        movb %ds:(%esi),%al
  802.        incl %esi
  803.        cmpb $0,%al
  804.        jnz cnonzero
  805.        movb %ds:(%esi),%al
  806.        incl %esi
  807.        subb %al,%dl
  808.        addl %eax,%edi
  809.        jmp cloop1
  810. cnonzero:
  811.        cmpl _umk_xmax,%edi
  812.        ja cdontplot
  813.        cmpl _umk_xmin,%edi
  814.        jb cdontplot
  815.        cmpb $0,_umk_flag
  816.        jnz cdontplot
  817.        andb $15,%al
  818.        addb %bl,%al
  819.        movb %al,%es:(%edi)
  820. cdontplot:
  821.        incl %edi
  822.        decb %dl
  823.        jmp cloop1
  824. clinedone:
  825.        decb %dh
  826.        jz cdone
  827.        movb _umk_wid,%al
  828.        movw $320,%cx
  829.        subw %ax,%cx
  830.        addl %ecx,%edi
  831.        movb %al,%dl
  832.        cmpb $0,_umk_flag
  833.        jnz cbfhandle
  834.        addl $320,_umk_xmin
  835.        addl $320,_umk_xmax
  836.        jmp cloop1
  837. cbfhandle:
  838.        decb _umk_flag
  839.        jmp cloop1
  840. cdone:
  841.        popa");
  842. }
  843.  
  844. /* constrain colour to a given 16-colour range- that is, if 19 is the colour
  845.    passed to this procedure, it will only draw in colours from 19 to 31. */
  846. void umk_colour2(int x,int y,byte c,umkrec u,scrntype scrn)
  847. {
  848.   if(y>199) return;
  849.   if(y<=-u.height) return;
  850.   if(x<=-u.width) return;
  851.   if(x>319) return;
  852.   umk_src=(long)u.img;
  853.   umk_dst=(long)scrn+x+y*320;
  854.   umk_xmin=(long)scrn+y*320;
  855.   if(y<0) {
  856.     umk_xmin=(long)scrn;
  857.     umk_flag=-y;
  858.   } else umk_flag=0;
  859.   umk_xmax=umk_xmin+319;
  860.   umk_wid=u.width;
  861.   umk_hgt=u.height;
  862.   if(y>200-u.height) umk_hgt=200-y;
  863.   umk_data=c;
  864.   asm("pusha
  865.        push %ds
  866.        pop  %es
  867.        movl _umk_src,%esi
  868.        movl _umk_dst,%edi
  869.        movb _umk_wid,%dl
  870.        movb _umk_hgt,%dh
  871.        xorl %eax,%eax
  872.        xorl %ecx,%ecx
  873.        movb _umk_data,%bl
  874.        movb _umk_data,%bh
  875.        shrb $4,%bh
  876.        shlb $4,%bh
  877.        addb $15,%bh
  878. c2loop1:
  879.        cmpb $0,%dl
  880.        jz c2linedone
  881.        movb %ds:(%esi),%al
  882.        incl %esi
  883.        cmpb $0,%al
  884.        jnz c2nonzero
  885.        movb %ds:(%esi),%al
  886.        incl %esi
  887.        subb %al,%dl
  888.        addl %eax,%edi
  889.        jmp c2loop1
  890. c2nonzero:
  891.        cmpl _umk_xmax,%edi
  892.        ja c2dontplot
  893.        cmpl _umk_xmin,%edi
  894.        jb c2dontplot
  895.        cmpb $0,_umk_flag
  896.        jnz c2dontplot
  897.        andb $15,%al
  898.        addb %bl,%al
  899.        cmpb %bh,%al
  900.        jbe  c2plotit
  901.        movb %bh,%al
  902. c2plotit:
  903.        movb %al,%es:(%edi)
  904. c2dontplot:
  905.        incl %edi
  906.        decb %dl
  907.        jmp c2loop1
  908. c2linedone:
  909.        decb %dh
  910.        jz c2done
  911.        movb _umk_wid,%al
  912.        movw $320,%cx
  913.        subw %ax,%cx
  914.        addl %ecx,%edi
  915.        movb %al,%dl
  916.        cmpb $0,_umk_flag
  917.        jnz c2bfhandle
  918.        addl $320,_umk_xmin
  919.        addl $320,_umk_xmax
  920.        jmp c2loop1
  921. c2bfhandle:
  922.        decb _umk_flag
  923.        jmp c2loop1
  924. c2done:
  925.        popa");
  926. }
  927.  
  928. void umk_robot(int x,int y,byte c,umkrec u,scrntype scrn)
  929. {
  930.   if(y>199) return;
  931.   if(y<=-u.height) return;
  932.   if(x<=-u.width) return;
  933.   if(x>319) return;
  934.   umk_src=(long)u.img;
  935.   umk_dst=(long)scrn+x+y*320;
  936.   umk_xmin=(long)scrn+y*320;
  937.   if(y<0) {
  938.     umk_xmin=(long)scrn;
  939.     umk_flag=-y;
  940.   } else umk_flag=0;
  941.   umk_xmax=umk_xmin+319;
  942.   umk_wid=u.width;
  943.   umk_hgt=u.height;
  944.   if(y>200-u.height) umk_hgt=200-y;
  945.   umk_data=c;
  946.   asm("pusha
  947.        push %ds
  948.        pop  %es
  949.        movl _umk_src,%esi
  950.        movl _umk_dst,%edi
  951.        movb _umk_wid,%dl
  952.        movb _umk_hgt,%dh
  953.        xorl %eax,%eax
  954.        xorl %ecx,%ecx
  955.        movb _umk_data,%bl
  956.        movb _umk_data,%bh
  957.        shrb $4,%bh
  958.        shlb $4,%bh
  959.        addb $15,%bh
  960. rloop1:
  961.        cmpb $0,%dl
  962.        jz rlinedone
  963.        movb %ds:(%esi),%al
  964.        incl %esi
  965.        cmpb $0,%al
  966.        jnz rnonzero
  967.        movb %ds:(%esi),%al
  968.        incl %esi
  969.        subb %al,%dl
  970.        addl %eax,%edi
  971.        jmp rloop1
  972. rnonzero:
  973.        cmpl _umk_xmax,%edi
  974.        ja rdontplot
  975.        cmpl _umk_xmin,%edi
  976.        jb rdontplot
  977.        cmpb $0,_umk_flag
  978.        jnz rdontplot
  979.        andb $15,%al
  980.        cmpb $15,%al
  981.        je   rplotit
  982.        incb %al
  983. rplotit:
  984.        addb %bl,%al
  985.        cmpb $255,%al
  986.        jne  rplotok
  987.        movb $239,%al
  988. rplotok:
  989.        movb %al,%es:(%edi)
  990. rdontplot:
  991.        incl %edi
  992.        decb %dl
  993.        jmp rloop1
  994. rlinedone:
  995.        decb %dh
  996.        jz   rdone
  997.        movb _umk_wid,%al
  998.        movw $320,%cx
  999.        subw %ax,%cx
  1000.        addl %ecx,%edi
  1001.        movb %al,%dl
  1002.        cmpb $0,_umk_flag
  1003.        jnz  rbfhandle
  1004.        addl $320,_umk_xmin
  1005.        addl $320,_umk_xmax
  1006.        jmp  rloop1
  1007. rbfhandle:
  1008.        decb _umk_flag
  1009.        jmp  rloop1
  1010. rdone:
  1011.        popa");
  1012. }
  1013.  
  1014. void umk_phase(int x,int y,umkrec u,scrntype scrn)
  1015. {
  1016.   if(y>199) return;
  1017.   if(y<=-u.height) return;
  1018.   if(x<=-u.width) return;
  1019.   if(x>319) return;
  1020.   umk_src=(long)u.img;
  1021.   umk_dst=(long)scrn+x+y*320;
  1022.   umk_xmin=(long)scrn+y*320;
  1023.   if(y<0) {
  1024.     umk_xmin=(long)scrn;
  1025.     umk_flag=-y;
  1026.   } else umk_flag=0;
  1027.   umk_xmax=umk_xmin+319;
  1028.   umk_wid=u.width;
  1029.   umk_hgt=u.height;
  1030.   if(y>200-u.height) umk_hgt=200-y;
  1031.   asm("pusha
  1032.        push %ds
  1033.        pop  %es
  1034.        movl _umk_src,%esi
  1035.        movl _umk_dst,%edi
  1036.        movb _umk_wid,%dl
  1037.        movb _umk_hgt,%dh
  1038.        movl %edi,%ebx
  1039.        xorl %eax,%eax
  1040.        xorl %ecx,%ecx
  1041. phloop1:
  1042.        cmpb $0,%dl
  1043.        jz phlinedone
  1044.        movb %ds:(%esi),%al
  1045.        incl %esi
  1046.        cmpb $0,%al
  1047.        jnz  phnonzero
  1048.        movb %ds:(%esi),%al
  1049.        incl %esi
  1050.        subb %al,%dl
  1051.        addl %eax,%edi
  1052.        addl %eax,%ebx
  1053.        jmp  phloop1
  1054. phnonzero:
  1055.        cmpl _umk_xmax,%edi
  1056.        ja   phdontplot
  1057.        cmpl _umk_xmin,%edi
  1058.        jb   phdontplot
  1059.        cmpb $0,_umk_flag
  1060.        jnz  phdontplot
  1061.        movb %es:(%ebx),%al
  1062.        movb %al,%es:(%edi)
  1063. phdontplot:
  1064.        incl %edi
  1065.        decb %dl
  1066.        movb %es:(%edi),%al
  1067.        rcrb $1,%al
  1068.        jc   phoddbyte
  1069.        incl %ebx
  1070. phoddbyte:
  1071.        incl %ebx
  1072.        jmp  phloop1
  1073. phlinedone:
  1074.        decb %dh
  1075.        jz   phdone
  1076.        movb _umk_wid,%al
  1077.        movw $320,%cx
  1078.        subw %ax,%cx
  1079.        addl %ecx,%edi
  1080.        movl %edi,%ebx
  1081.        movb %al,%dl
  1082.        cmpb $0,_umk_flag
  1083.        jnz  phbfhandle
  1084.        addl $320,_umk_xmin
  1085.        addl $320,_umk_xmax
  1086.        jmp  phloop1
  1087. phbfhandle:
  1088.        decb _umk_flag
  1089.        jmp  phloop1
  1090. phdone:
  1091.        popa");
  1092. }
  1093.  
  1094. void umk_shadow(int x,int y,colmat c,umkrec u,scrntype scrn)
  1095. {
  1096.   if(y>199) return;
  1097.   if(y<=-u.height) return;
  1098.   if(x<=-u.width) return;
  1099.   if(x>319) return;
  1100.   umk_src=(long)u.img;
  1101.   umk_dst=(long)scrn+x+y*320;
  1102.   umk_xmin=(long)scrn+y*320;
  1103.   if(y<0) {
  1104.     umk_xmin=(long)scrn;
  1105.     umk_flag=-y;
  1106.   } else umk_flag=0;
  1107.   umk_xmax=umk_xmin+319;
  1108.   umk_wid=u.width;
  1109.   umk_hgt=u.height;
  1110.   if(y>200-u.height) umk_hgt=200-y;
  1111.   umk_caddr=(long)c;
  1112.   asm("pusha
  1113.        push %ds
  1114.        pop  %es
  1115.        movl _umk_src,%esi
  1116.        movl _umk_dst,%edi
  1117.        movb _umk_wid,%dl
  1118.        movb _umk_hgt,%dh
  1119.        xorl %eax,%eax
  1120.        xorl %ecx,%ecx
  1121.        movl _umk_caddr,%ebx
  1122. shloop1:
  1123.        cmpb $0,%dl
  1124.        jz shlinedone
  1125.        movb %ds:(%esi),%al
  1126.        incl %esi
  1127.        cmpb $0,%al
  1128.        jnz  shnonzero
  1129.        movb %ds:(%esi),%al
  1130.        incl %esi
  1131.        subb %al,%dl
  1132.        addl %eax,%edi
  1133.        jmp  shloop1
  1134. shnonzero:
  1135.        cmpl _umk_xmax,%edi
  1136.        ja   shdontplot
  1137.        cmpl _umk_xmin,%edi
  1138.        jb   shdontplot
  1139.        cmpb $0,_umk_flag
  1140.        jnz  shdontplot
  1141.        movb %es:(%edi),%al
  1142.        movb %ds:(%ebx,%eax),%al
  1143.        movb %al,%es:(%edi)
  1144. shdontplot:
  1145.        incl %edi
  1146.        decb %dl
  1147.        jmp  shloop1
  1148. shlinedone:
  1149.        decb %dh
  1150.        jz   shdone
  1151.        movb _umk_wid,%al
  1152.        movw $320,%cx
  1153.        subw %ax,%cx
  1154.        addl %ecx,%edi
  1155.        movb %al,%dl
  1156.        cmpb $0,_umk_flag
  1157.        jnz  shbfhandle
  1158.        addl $320,_umk_xmin
  1159.        addl $320,_umk_xmax
  1160.        jmp  shloop1
  1161. shbfhandle:
  1162.        decb _umk_flag
  1163.        jmp  shloop1
  1164. shdone:
  1165.        popa");
  1166. }
  1167.  
  1168. void umk_altern(int x,int y,colmat c,umkrec u,scrntype scrn)
  1169. {
  1170.   if(y>199) return;
  1171.   if(y<=-u.height) return;
  1172.   if(x<=-u.width) return;
  1173.   if(x>319) return;
  1174.   umk_src=(long)u.img;
  1175.   umk_dst=(long)scrn+x+y*320;
  1176.   umk_xmin=(long)scrn+y*320;
  1177.   if(y<0) {
  1178.     umk_xmin=(long)scrn;
  1179.     umk_flag=-y;
  1180.   } else umk_flag=0;
  1181.   umk_xmax=umk_xmin+319;
  1182.   umk_wid=u.width;
  1183.   umk_hgt=u.height;
  1184.   if(y>200-u.height) umk_hgt=200-y;
  1185.   umk_caddr=(long)c;
  1186.   asm("pusha
  1187.        push %ds
  1188.        pop  %es
  1189.        movl _umk_src,%esi
  1190.        movl _umk_dst,%edi
  1191.        movb _umk_wid,%dl
  1192.        movb _umk_hgt,%dh
  1193.        movl _umk_caddr,%ebx
  1194.        xorl %eax,%eax
  1195. aloop1:
  1196.        cmpb $0,%dl
  1197.        jz   alinedone
  1198.        movb %ds:(%esi),%al
  1199.        incl %esi
  1200.        cmpb $0,%al
  1201.        jnz  anonzero
  1202.        movb %ds:(%esi),%al
  1203.        incl %esi
  1204.        subb %al,%dl
  1205.        addl %eax,%edi
  1206.        jmp  aloop1
  1207. anonzero:
  1208.        cmpl _umk_xmax,%edi
  1209.        ja   adontplot
  1210.        cmpl _umk_xmin,%edi
  1211.        jb   adontplot
  1212.        cmpb $0,_umk_flag
  1213.        jnz  adontplot
  1214.        movb %ds:(%ebx,%eax),%al
  1215.        movb %al,%es:(%edi)
  1216. adontplot:
  1217.        incl %edi
  1218.        decb %dl
  1219.        jmp  aloop1
  1220. alinedone:
  1221.        decb %dh
  1222.        jz   adone
  1223.        xorl %ecx,%ecx
  1224.        movb _umk_wid,%al
  1225.        movw $320,%cx
  1226.        subw %ax,%cx
  1227.        addl %ecx,%edi
  1228.        movb %al,%dl
  1229.        cmpb $0,_umk_flag
  1230.        jnz  abfhandle
  1231.        addl $320,_umk_xmin
  1232.        addl $320,_umk_xmax
  1233.        jmp  aloop1
  1234. abfhandle:
  1235.        decb _umk_flag
  1236.        jmp  aloop1
  1237. adone:
  1238.        popa");
  1239. }
  1240.  
  1241. void umk_flip(int x,int y,umkrec u,scrntype scrn)
  1242. {
  1243.   if(y>199) return;
  1244.   if(y<=-u.height) return;
  1245.   if(x<=-u.width) return;
  1246.   if(x>319) return;
  1247.   umk_src=(long)u.img;
  1248.   umk_dst=(long)scrn+x-1+u.width+y*320;
  1249.   umk_xmin=(long)scrn+y*320;
  1250.   if(y<0) {
  1251.     umk_xmin=(long)scrn;
  1252.     umk_flag=-y;
  1253.   } else umk_flag=0;
  1254.   umk_xmax=umk_xmin+319;
  1255.   umk_wid=u.width;
  1256.   umk_hgt=u.height;
  1257.   if(y>200-u.height) umk_hgt=200-y;
  1258.   asm("pusha
  1259.        push %ds
  1260.        pop  %es
  1261.        movl _umk_src,%esi
  1262.        movl _umk_dst,%edi
  1263.        movb _umk_wid,%dl
  1264.        movb _umk_hgt,%dh
  1265.        xorl %eax,%eax
  1266.        xorl %ecx,%ecx
  1267. floop1:
  1268.        cmpb $0,%dl
  1269.        jz   flinedone
  1270.        movb %ds:(%esi),%al
  1271.        incl %esi
  1272.        cmpb $0,%al
  1273.        jnz  fnonzero
  1274.        movb %ds:(%esi),%al
  1275.        incl %esi
  1276.        subb %al,%dl
  1277.        subl %eax,%edi
  1278.        jmp  floop1
  1279. fnonzero:
  1280.        cmpl _umk_xmax,%edi
  1281.        ja   fdontplot
  1282.        cmpl _umk_xmin,%edi
  1283.        jb   fdontplot
  1284.        cmpb $0,_umk_flag
  1285.        jnz  fdontplot
  1286.        movb %al,%es:(%edi)
  1287. fdontplot:
  1288.        decl %edi
  1289.        decb %dl
  1290.        jmp  floop1
  1291. flinedone:
  1292.        decb %dh
  1293.        jz   fdone
  1294.        movb _umk_wid,%al
  1295.        movw $320,%cx
  1296.        addw %ax,%cx
  1297.        addl %ecx,%edi
  1298.        movb %al,%dl
  1299.        cmpb $0,_umk_flag
  1300.        jnz  fbfhandle
  1301.        addl $320,_umk_xmin
  1302.        addl $320,_umk_xmax
  1303.        jmp  floop1
  1304. fbfhandle:
  1305.        decb _umk_flag
  1306.        jmp  floop1
  1307. fdone:
  1308.        popa");
  1309. }
  1310.  
  1311. void umk_flip_solid(int x,int y,byte col,umkrec u,scrntype scrn)
  1312. {
  1313.   if(y>199) return;
  1314.   if(y<=-u.height) return;
  1315.   if(x<=-u.width) return;
  1316.   if(x>319) return;
  1317.   umk_src=(long)u.img;
  1318.   umk_dst=(long)scrn+x-1+u.width+y*320;
  1319.   umk_xmin=(long)scrn+y*320;
  1320.   if(y<0) {
  1321.     umk_xmin=(long)scrn;
  1322.     umk_flag=-y;
  1323.   } else umk_flag=0;
  1324.   umk_xmax=umk_xmin+319;
  1325.   umk_wid=u.width;
  1326.   umk_hgt=u.height;
  1327.   umk_data=col;
  1328.   if(y>200-u.height) umk_hgt=200-y;
  1329.   asm("pusha
  1330.        push %ds
  1331.        pop  %es
  1332.        movl _umk_src,%esi
  1333.        movl _umk_dst,%edi
  1334.        movb _umk_wid,%dl
  1335.        movb _umk_hgt,%dh
  1336.        movb _umk_data,%bl
  1337. fsloop1:
  1338.        cmpb $0,%dl
  1339.        jz   fslinedone
  1340.        movw %ds:(%esi),%ax
  1341.        cmpb $0,%al
  1342.        jnz  fsnonzero
  1343.        xorl %ecx,%ecx
  1344.        subb %ah,%dl
  1345.        movb %ah,%cl
  1346.        subl %ecx,%edi
  1347.        incl %esi
  1348.        incl %esi
  1349.        jmp  fsloop1
  1350. fsnonzero:
  1351.        cmpl _umk_xmax,%edi
  1352.        ja   fsdontplot
  1353.        cmpl _umk_xmin,%edi
  1354.        jb   fsdontplot
  1355.        cmpb $0,_umk_flag
  1356.        jnz  fsdontplot
  1357.        movb %bl,%es:(%edi)
  1358. fsdontplot:
  1359.        incl %esi
  1360.        decl %edi
  1361.        decb %dl
  1362.        jmp  fsloop1
  1363. fslinedone:
  1364.        decb %dh
  1365.        jz   fsdone
  1366.        xorl %ecx,%ecx
  1367.        xorw %ax,%ax
  1368.        movb _umk_wid,%al
  1369.        movw $320,%cx
  1370.        addw %ax,%cx
  1371.        addl %ecx,%edi
  1372.        movb %al,%dl
  1373.        cmpb $0,_umk_flag
  1374.        jnz  fsbfhandle
  1375.        addl $320,_umk_xmin
  1376.        addl $320,_umk_xmax
  1377.        jmp  fsloop1
  1378. fsbfhandle:
  1379.        decb _umk_flag
  1380.        jmp  fsloop1
  1381. fsdone:
  1382.        popa");
  1383. }
  1384.  
  1385. void umk_flip_limit(rect r,int x,int y,umkrec u,scrntype scrn)
  1386. {
  1387.   long yy;
  1388.   if(y>r.y2) return;
  1389.   if(y<=r.y-u.height) return;
  1390.   if(x<=r.x-u.width) return;
  1391.   if(x>r.x2) return;
  1392.   yy=(long)scrn+y*320;
  1393.   umk_src=(long)u.img;
  1394.   umk_dst=x-1+u.width+yy;
  1395.   umk_xmin=r.x+yy;
  1396.   umk_xmax=r.x2+yy;
  1397.   if(y<r.y) {
  1398.     yy=(long)scrn+r.y*320;
  1399.     umk_xmin=r.x+yy;
  1400.     umk_xmax=r.x2+yy;
  1401.     umk_flag=r.y-y;
  1402.   } else umk_flag=0;
  1403.   umk_wid=u.width;
  1404.   umk_hgt=u.height;
  1405.   if(y>r.y2-u.height) umk_hgt=r.y2-y+1;
  1406.   umk_data=(byte)r.y2;
  1407.   asm("pusha
  1408.        push %ds
  1409.        pop  %es
  1410.        movl _umk_src,%esi
  1411.        movl _umk_dst,%edi
  1412.        movb _umk_wid,%dl
  1413.        movb _umk_hgt,%dh
  1414.        xorl %ebx,%ebx
  1415.        xorl %eax,%eax
  1416.        cmpb $0,_umk_flag
  1417.        jnz flquickstart
  1418. flloop1:
  1419.        cmpb $0,%dl
  1420.        jz   fllinedone
  1421.        movb %ds:(%esi),%al
  1422.        cmpb $0,%al
  1423.        jnz  flnonzero
  1424.        incl %esi
  1425.        movb %ds:(%esi),%al
  1426.        subb %al,%dl
  1427.        subl %eax,%edi
  1428.        incl %esi
  1429.        jmp  flloop1
  1430. flnonzero:
  1431.        cmpl _umk_xmax,%edi
  1432.        ja   fldontplot
  1433.        cmpl _umk_xmin,%edi
  1434.        jb   flpastend
  1435.        movb %al,%es:(%edi)
  1436. fldontplot:
  1437.        incl %esi
  1438.        decl %edi
  1439.        decb %dl
  1440.        jmp  flloop1
  1441. flpastend:
  1442.        call flquickfinish
  1443. fllinedone:
  1444.        decb %dh
  1445.        jz   fldone
  1446.        xorl %ecx,%ecx
  1447.        movb _umk_wid,%bl
  1448.        movw $320,%cx
  1449.        addw %bx,%cx
  1450.        addl %ecx,%edi
  1451.        movb %bl,%dl
  1452.        addl $320,_umk_xmin
  1453.        addl $320,_umk_xmax
  1454.        jmp  flloop1
  1455. flqfinish2:
  1456.        movb (%esi),%al
  1457.        cmpb $0,%al
  1458.        jnz  flquickfinish
  1459.        incl %esi
  1460.        movb (%esi),%al
  1461.        decb %al
  1462.        subl %eax,%edi
  1463.        subb %al,%dl
  1464. flquickfinish:
  1465.        # this is called when the drawing has hit xmax, so that it will
  1466.        # just hurry through the rest of the line
  1467.        incl %esi
  1468.        decl %edi
  1469.        decb %dl
  1470.        jnz  flqfinish2
  1471.        ret
  1472. flquickstart:
  1473.        decl %esi
  1474.        incl %edi
  1475.        incb %dl
  1476.        call flquickfinish
  1477.        movb _umk_wid,%al
  1478.        addl %eax,%edi
  1479.        addl $320,%edi
  1480.        movb %al,%dl
  1481.        decb %dh
  1482.        decb _umk_flag
  1483.        jnz  flquickstart
  1484.        jmp  flloop1
  1485. fldone:
  1486.        popa");
  1487. }
  1488.  
  1489. void umk_flip_partial(int x,int y,byte amt,umkrec u,scrntype scrn)
  1490. {
  1491.   if(y>199) return;
  1492.   if(y<=-u.height) return;
  1493.   if(x<=-u.width) return;
  1494.   if(x>319) return;
  1495.   umk_src=(long)u.img;
  1496.   umk_dst=(long)scrn+x-1+u.width+y*320;
  1497.   umk_xmin=(long)scrn+y*320;
  1498.   if(y<0) {
  1499.     umk_xmin=(long)scrn;
  1500.     umk_flag=-y;
  1501.   } else umk_flag=0;
  1502.   umk_xmax=umk_xmin+319;
  1503.   umk_wid=u.width;
  1504.   umk_hgt=u.height;
  1505.   if(y>199-u.height) umk_hgt=200-y;
  1506.   umk_data=amt;
  1507.   asm("pusha
  1508.        push %ds
  1509.        pop  %es
  1510.        movl _umk_src,%esi
  1511.        movl _umk_dst,%edi
  1512.        movb _umk_wid,%dl
  1513.        movb _umk_hgt,%dh
  1514.        movb _umk_data,%bl
  1515.        xorl %eax,%eax
  1516.        xorl %ecx,%ecx
  1517. fploop1:
  1518.        cmpb $0,%dl
  1519.        jz   fplinedone
  1520.        movb %ds:(%esi),%al
  1521.        cmpb $0,%al
  1522.        jnz  fpnonzero
  1523.        incl %esi
  1524.        movb %ds:(%esi),%al
  1525.        subb %al,%dl
  1526.        subl %eax,%edi
  1527.        incl %esi
  1528.        jmp  fploop1
  1529. fpnonzero:
  1530.        cmpl _umk_xmax,%edi
  1531.        ja   fpdontplot2
  1532.        cmpl _umk_xmin,%edi
  1533.        jb   fpdontplot2
  1534.        cmpb $0,_umk_flag
  1535.        jnz  fpdontplot2
  1536.        decb %bl
  1537.        cmpb $0,%bl
  1538.        jz   fpdontplot
  1539.        movb %al,%es:(%edi)
  1540.        incl %esi
  1541.        decl %edi
  1542.        decb %dl
  1543.        jmp  fploop1
  1544. fpdontplot:
  1545.        movb _umk_data,%bl
  1546. fpdontplot2:
  1547.        incl %esi
  1548.        decl %edi
  1549.        decb %dl
  1550.        jmp  fploop1
  1551. fplinedone:
  1552.        decb %dh
  1553.        jz   fpdone
  1554.        movb _umk_wid,%al
  1555.        movw $320,%cx
  1556.        addw %ax,%cx
  1557.        addl %ecx,%edi
  1558.        movb %al,%dl
  1559.        cmpb $0,_umk_flag
  1560.        jnz  fpbfhandle
  1561.        addl $320,_umk_xmin
  1562.        addl $320,_umk_xmax
  1563.        jmp  fploop1
  1564. fpbfhandle:
  1565.        decb _umk_flag
  1566.        jmp  fploop1
  1567. fpdone:
  1568.        popa");
  1569. }
  1570.  
  1571. void umk_flip_unpartial(int x,int y,byte amt,umkrec u,scrntype scrn)
  1572. {
  1573.   if(y>199) return;
  1574.   if(y<=-u.height) return;
  1575.   if(x<=-u.width) return;
  1576.   if(x>319) return;
  1577.   umk_src=(long)u.img;
  1578.   umk_dst=(long)scrn+x-1+u.width+y*320;
  1579.   umk_xmin=(long)scrn+y*320;
  1580.   if(y<0) {
  1581.     umk_xmin=(long)scrn;
  1582.     umk_flag=-y;
  1583.   } else umk_flag=0;
  1584.   umk_xmax=umk_xmin+319;
  1585.   umk_wid=u.width;
  1586.   umk_hgt=u.height;
  1587.   if(y>199-u.height) umk_hgt=200-y;
  1588.   umk_data=amt;
  1589.   asm("pusha
  1590.        push %ds
  1591.        pop  %es
  1592.        movl _umk_src,%esi
  1593.        movl _umk_dst,%edi
  1594.        movb _umk_wid,%dl
  1595.        movb _umk_hgt,%dh
  1596.        movb _umk_data,%bl
  1597.        xorl %eax,%eax
  1598.        xorl %ecx,%ecx
  1599. fuloop1:
  1600.        cmpb $0,%dl
  1601.        jz   fulinedone
  1602.        movb %ds:(%esi),%al
  1603.        cmpb $0,%al
  1604.        jnz  funonzero
  1605.        incl %esi
  1606.        movb %ds:(%esi),%al
  1607.        subb %al,%dl
  1608.        subl %eax,%edi
  1609.        incl %esi
  1610.        jmp  fuloop1
  1611. funonzero:
  1612.        decb %bl
  1613.        cmpb $0,%bl
  1614.        jz   fuplot
  1615. fudontplot:
  1616.        incl %esi
  1617.        decl %edi
  1618.        decb %dl
  1619.        jmp  fuloop1
  1620. fuplot:
  1621.        cmpl _umk_xmax,%edi
  1622.        ja   fudontplot
  1623.        cmpl _umk_xmin,%edi
  1624.        jb   fudontplot
  1625.        cmpb $0,_umk_flag
  1626.        jnz  fudontplot
  1627.        movb %al,%es:(%edi)
  1628.        movb _umk_data,%bl
  1629.        incl %esi
  1630.        decl %edi
  1631.        decb %dl
  1632.        jmp  fuloop1
  1633. fulinedone:
  1634.        decb %dh
  1635.        jz   fudone
  1636.        movb _umk_wid,%al
  1637.        movw $320,%cx
  1638.        addw %ax,%cx
  1639.        addl %ecx,%edi
  1640.        movb %al,%dl
  1641.        cmpb $0,_umk_flag
  1642.        jnz  fubfhandle
  1643.        addl $320,_umk_xmin
  1644.        addl $320,_umk_xmax
  1645.        jmp  fuloop1
  1646. fubfhandle:
  1647.        decb _umk_flag
  1648.        jmp fuloop1
  1649. fudone:
  1650.        popa");
  1651. }
  1652.  
  1653. void umk_flip_colour(int x,int y,byte c,umkrec u,scrntype scrn)
  1654. {
  1655.   if(y>199) return;
  1656.   if(y<=-u.height) return;
  1657.   if(x<=-u.width) return;
  1658.   if(x>319) return;
  1659.   umk_src=(long)u.img;
  1660.   umk_dst=(long)scrn+x-1+u.width+y*320;
  1661.   umk_xmin=(long)scrn+y*320;
  1662.   if(y<0) {
  1663.     umk_xmin=(long)scrn;
  1664.     umk_flag=-y;
  1665.   } else umk_flag=0;
  1666.   umk_xmax=umk_xmin+319;
  1667.   umk_wid=u.width;
  1668.   umk_hgt=u.height;
  1669.   if(y>200-u.height) umk_hgt=200-y;
  1670.   umk_data=c;
  1671.   asm("pusha
  1672.        push %ds
  1673.        pop  %es
  1674.        movl _umk_src,%esi
  1675.        movl _umk_dst,%edi
  1676.        movb _umk_wid,%dl
  1677.        movb _umk_hgt,%dh
  1678.        xorl %eax,%eax
  1679.        xorl %ecx,%ecx
  1680.        mov _umk_data,%bl
  1681. fcloop1:
  1682.        cmpb $0,%dl
  1683.        jz   fclinedone
  1684.        movb %ds:(%esi),%al
  1685.        incl %esi
  1686.        cmpb $0,%al
  1687.        jnz  fcnonzero
  1688.        movb %ds:(%esi),%al
  1689.        incl %esi
  1690.        subb %al,%dl
  1691.        subl %eax,%edi
  1692.        jmp  fcloop1
  1693. fcnonzero:
  1694.        cmpl _umk_xmax,%edi
  1695.        ja   fcdontplot
  1696.        cmpl _umk_xmin,%edi
  1697.        jb   fcdontplot
  1698.        cmpb $0,_umk_flag
  1699.        jnz  fcdontplot
  1700.        andb $15,%al
  1701.        addb %bl,%al
  1702.        movb %al,%es:(%edi)
  1703. fcdontplot:
  1704.        decl %edi
  1705.        decb %dl
  1706.        jmp  fcloop1
  1707. fclinedone:
  1708.        decb %dh
  1709.        jz   fcdone
  1710.        movb _umk_wid,%al
  1711.        movw $320,%cx
  1712.        addw %ax,%cx
  1713.        addl %ecx,%edi
  1714.        movb %al,%dl
  1715.        cmpb $0,_umk_flag
  1716.        jnz  fcbfhandle
  1717.        addl $320,_umk_xmin
  1718.        addl $320,_umk_xmax
  1719.        jmp  fcloop1
  1720. fcbfhandle:
  1721.        decb _umk_flag
  1722.        jmp  fcloop1
  1723. fcdone:
  1724.        popa");
  1725. }
  1726.  
  1727. /* constrain colour to a given 16-colour range- that is, if 19 is the colour
  1728.    passed to this procedure, it will only draw in colours from 19 to 31. */
  1729. void umk_flip_colour2(int x,int y,byte c,umkrec u,scrntype scrn)
  1730. {
  1731.   if(y>199) return;
  1732.   if(y<=-u.height) return;
  1733.   if(x<=-u.width) return;
  1734.   if(x>319) return;
  1735.   umk_src=(long)u.img;
  1736.   umk_dst=(long)scrn+x-1+u.width+y*320;
  1737.   umk_xmin=(long)scrn+y*320;
  1738.   if(y<0) {
  1739.     umk_xmin=(long)scrn;
  1740.     umk_flag=-y;
  1741.   } else umk_flag=0;
  1742.   umk_xmax=umk_xmin+319;
  1743.   umk_wid=u.width;
  1744.   umk_hgt=u.height;
  1745.   if(y>200-u.height) umk_hgt=200-y;
  1746.   umk_data=c;
  1747.   asm("pusha
  1748.        push %ds
  1749.        pop  %es
  1750.        movl _umk_src,%esi
  1751.        movl _umk_dst,%edi
  1752.        movb _umk_wid,%dl
  1753.        movb _umk_hgt,%dh
  1754.        xorl %eax,%eax
  1755.        xorl %ecx,%ecx
  1756.        movb _umk_data,%bl
  1757.        movb _umk_data,%bh
  1758.        shrb $4,%bh
  1759.        shlb $4,%bh
  1760.        addb $15,%bh
  1761. fc2loop1:
  1762.        cmpb $0,%dl
  1763.        jz   fc2linedone
  1764.        movb %ds:(%esi),%al
  1765.        incl %esi
  1766.        cmpb $0,%al
  1767.        jnz  fc2nonzero
  1768.        movb %ds:(%esi),%al
  1769.        incl %esi
  1770.        subb %al,%dl
  1771.        subl %eax,%edi
  1772.        jmp  fc2loop1
  1773. fc2nonzero:
  1774.        cmpl _umk_xmax,%edi
  1775.        ja   fc2dontplot
  1776.        cmpl _umk_xmin,%edi
  1777.        jb   fc2dontplot
  1778.        cmpb $0,_umk_flag
  1779.        jnz  fc2dontplot
  1780.        andb $15,%al
  1781.        addb %bl,%al
  1782.        cmpb %bh,%al
  1783.        jbe  fc2plotit
  1784.        movb %bh,%al
  1785. fc2plotit:
  1786.        movb %al,%es:(%edi)
  1787. fc2dontplot:
  1788.        decl %edi
  1789.        decb %dl
  1790.        jmp  fc2loop1
  1791. fc2linedone:
  1792.        decb %dh
  1793.        jz   fc2done
  1794.        movb _umk_wid,%al
  1795.        movw $320,%cx
  1796.        addw %ax,%cx
  1797.        addl %ecx,%edi
  1798.        movb %al,%dl
  1799.        cmpb $0,_umk_flag
  1800.        jnz  fc2bfhandle
  1801.        addl $320,_umk_xmin
  1802.        addl $320,_umk_xmax
  1803.        jmp  fc2loop1
  1804. fc2bfhandle:
  1805.        decb _umk_flag
  1806.        jmp  fc2loop1
  1807. fc2done:
  1808.        popa");
  1809. }
  1810.  
  1811. void umk_flip_robot(int x,int y,byte c,umkrec u,scrntype scrn)
  1812. {
  1813.   if(y>199) return;
  1814.   if(y<=-u.height) return;
  1815.   if(x<=-u.width) return;
  1816.   if(x>319) return;
  1817.   umk_src=(long)u.img;
  1818.   umk_dst=(long)scrn+x-1+u.width+y*320;
  1819.   umk_xmin=(long)scrn+y*320;
  1820.   if(y<0) {
  1821.     umk_xmin=(long)scrn;
  1822.     umk_flag=-y;
  1823.   } else umk_flag=0;
  1824.   umk_xmax=umk_xmin+319;
  1825.   umk_wid=u.width;
  1826.   umk_hgt=u.height;
  1827.   if(y>200-u.height) umk_hgt=200-y;
  1828.   umk_data=c;
  1829.   asm("pusha
  1830.        push %ds
  1831.        pop  %es
  1832.        movl _umk_src,%esi
  1833.        movl _umk_dst,%edi
  1834.        movb _umk_wid,%dl
  1835.        movb _umk_hgt,%dh
  1836.        xorl %eax,%eax
  1837.        xorl %ecx,%ecx
  1838.        movb _umk_data,%bl
  1839.        movb _umk_data,%bh
  1840.        shrb $4,%bh
  1841.        shlb $4,%bh
  1842.        addb $15,%bh
  1843. frloop1:
  1844.        cmpb $0,%dl
  1845.        jz   frlinedone
  1846.        movb %ds:(%esi),%al
  1847.        incl %esi
  1848.        cmpb $0,%al
  1849.        jnz  frnonzero
  1850.        movb %ds:(%esi),%al
  1851.        incl %esi
  1852.        subb %al,%dl
  1853.        subl %eax,%edi
  1854.        jmp  frloop1
  1855. frnonzero:
  1856.        cmpl _umk_xmax,%edi
  1857.        ja   frdontplot
  1858.        cmpl _umk_xmin,%edi
  1859.        jb   frdontplot
  1860.        cmpb $0,_umk_flag
  1861.        jnz  frdontplot
  1862.        andb $15,%al
  1863.        cmpb $15,%al
  1864.        je   frplotit
  1865.        incb %al
  1866. frplotit:
  1867.        addb %bl,%al
  1868.        cmpb $255,%al
  1869.        jne  frplotok
  1870.        movb $239,%al
  1871. frplotok:
  1872.        movb %al,%es:(%edi)
  1873. frdontplot:
  1874.        decl %edi
  1875.        decb %dl
  1876.        jmp  frloop1
  1877. frlinedone:
  1878.        decb %dh
  1879.        jz   frdone
  1880.        movb _umk_wid,%al
  1881.        movw $320,%cx
  1882.        addw %ax,%cx
  1883.        addl %ecx,%edi
  1884.        movb %al,%dl
  1885.        cmpb $0,_umk_flag
  1886.        jnz  frbfhandle
  1887.        addl $320,_umk_xmin
  1888.        addl $320,_umk_xmax
  1889.        jmp  frloop1
  1890. frbfhandle:
  1891.        decb _umk_flag
  1892.        jmp  frloop1
  1893. frdone:
  1894.        popa");
  1895. }
  1896.  
  1897. void umk_flip_phase(int x,int y,umkrec u,scrntype scrn)
  1898. {
  1899.   if(y>199) return;
  1900.   if(y<=-u.height) return;
  1901.   if(x<=-u.width) return;
  1902.   if(x>319) return;
  1903.   umk_src=(long)u.img;
  1904.   umk_dst=(long)scrn+x-1+u.width+y*320;
  1905.   umk_xmin=(long)scrn+y*320;
  1906.   if(y<0) {
  1907.     umk_xmin=(long)scrn;
  1908.     umk_flag=-y;
  1909.   } else umk_flag=0;
  1910.   umk_xmax=umk_xmin+319;
  1911.   umk_wid=u.width;
  1912.   umk_hgt=u.height;
  1913.   if(y>200-u.height) umk_hgt=200-y;
  1914.   asm("pusha
  1915.        push %ds
  1916.        pop  %es
  1917.        movl _umk_src,%esi
  1918.        movl _umk_dst,%edi
  1919.        movb _umk_wid,%dl
  1920.        movb _umk_hgt,%dh
  1921.        movl %edi,%ebx
  1922.        xorl %eax,%eax
  1923.        xorl %ecx,%ecx
  1924. fphloop1:
  1925.        cmpb $0,%dl
  1926.        jz   fphlinedone
  1927.        movb %ds:(%esi),%al
  1928.        incl %esi
  1929.        cmpb $0,%al
  1930.        jnz  fphnonzero
  1931.        movb %ds:(%esi),%al
  1932.        incl %esi
  1933.        subb %al,%dl
  1934.        subl %eax,%edi
  1935.        subl %eax,%ebx
  1936.        jmp  fphloop1
  1937. fphnonzero:
  1938.        cmpl _umk_xmax,%edi
  1939.        ja   fphdontplot
  1940.        cmpl _umk_xmin,%edi
  1941.        jb   fphdontplot
  1942.        cmpb $0,_umk_flag
  1943.        jnz  fphdontplot
  1944.        movb %es:(%ebx),%al
  1945.        movb %al,%es:(%edi)
  1946. fphdontplot:
  1947.        decl %edi
  1948.        decb %dl
  1949.        movb %es:(%edi),%al
  1950.        rcrb $1,%al
  1951.        jc   fphoddbyte
  1952.        decl %ebx
  1953. fphoddbyte:
  1954.        decl %ebx
  1955.        jmp  fphloop1
  1956. fphlinedone:
  1957.        decb %dh
  1958.        jz   fphdone
  1959.        movb _umk_wid,%al
  1960.        movw $320,%cx
  1961.        addw %ax,%cx
  1962.        addl %ecx,%edi
  1963.        movl %edi,%ebx
  1964.        movb %al,%dl
  1965.        cmpb $0,_umk_flag
  1966.        jnz  fphbfhandle
  1967.        addl $320,_umk_xmin
  1968.        addl $320,_umk_xmax
  1969.        jmp  fphloop1
  1970. fphbfhandle:
  1971.        decb _umk_flag
  1972.        jmp  fphloop1
  1973. fphdone:
  1974.        popa");
  1975. }
  1976.  
  1977. void umk_flip_shadow(int x,int y,colmat c,umkrec u,scrntype scrn)
  1978. {
  1979.   if(y>199) return;
  1980.   if(y<=-u.height) return;
  1981.   if(x<=-u.width) return;
  1982.   if(x>319) return;
  1983.   umk_src=(long)u.img;
  1984.   umk_dst=(long)scrn+x-1+u.width+y*320;
  1985.   umk_xmin=(long)scrn+y*320;
  1986.   if(y<0) {
  1987.     umk_xmin=(long)scrn;
  1988.     umk_flag=-y;
  1989.   } else umk_flag=0;
  1990.   umk_xmax=umk_xmin+319;
  1991.   umk_wid=u.width;
  1992.   umk_hgt=u.height;
  1993.   if(y>200-u.height) umk_hgt=200-y;
  1994.   umk_caddr=(long)c;
  1995.   asm("pusha
  1996.        push %ds
  1997.        pop  %es
  1998.        movl _umk_src,%esi
  1999.        movl _umk_dst,%edi
  2000.        movb _umk_wid,%dl
  2001.        movb _umk_hgt,%dh
  2002.        xorl %eax,%eax
  2003.        xorl %ecx,%ecx
  2004.        movl _umk_caddr,%ebx
  2005. fshloop1:
  2006.        cmpb $0,%dl
  2007.        jz   fshlinedone
  2008.        movb %ds:(%esi),%al
  2009.        incl %esi
  2010.        cmpb $0,%al
  2011.        jnz  fshnonzero
  2012.        movb %ds:(%esi),%al
  2013.        incl %esi
  2014.        subb %al,%dl
  2015.        subl %eax,%edi
  2016.        jmp  fshloop1
  2017. fshnonzero:
  2018.        cmpl _umk_xmax,%edi
  2019.        ja   fshdontplot
  2020.        cmpl _umk_xmin,%edi
  2021.        jb   fshdontplot
  2022.        cmpb $0,_umk_flag
  2023.        jnz  fshdontplot
  2024.        movb %es:(%edi),%al
  2025.        movb %ds:(%ebx,%eax),%al
  2026.        movb %al,%es:(%edi)
  2027. fshdontplot:
  2028.        decl %edi
  2029.        decb %dl
  2030.        jmp  shloop1
  2031. fshlinedone:
  2032.        decb %dh
  2033.        jz   shdone
  2034.        movb _umk_wid,%al
  2035.        movw $320,%cx
  2036.        addw %ax,%cx
  2037.        addl %ecx,%edi
  2038.        movb %al,%dl
  2039.        cmpb $0,_umk_flag
  2040.        jnz  fshbfhandle
  2041.        addl $320,_umk_xmin
  2042.        addl $320,_umk_xmax
  2043.        jmp  fshloop1
  2044. fshbfhandle:
  2045.        decb _umk_flag
  2046.        jmp  fshloop1
  2047. fshdone:
  2048.        popa");
  2049. }
  2050.  
  2051. void umk_flip_altern(int x,int y,colmat c,umkrec u,scrntype scrn)
  2052. {
  2053.   if(y>199) return;
  2054.   if(y<=-u.height) return;
  2055.   if(x<=-u.width) return;
  2056.   if(x>319) return;
  2057.   umk_src=(long)u.img;
  2058.   umk_dst=(long)scrn+x-1+u.width+y*320;
  2059.   umk_xmin=(long)scrn+y*320;
  2060.   if(y<0) {
  2061.     umk_xmin=(long)scrn;
  2062.     umk_flag=-y;
  2063.   } else umk_flag=0;
  2064.   umk_xmax=umk_xmin+319;
  2065.   umk_wid=u.width;
  2066.   umk_hgt=u.height;
  2067.   if(y>200-u.height) umk_hgt=200-y;
  2068.   umk_caddr=(long)c;
  2069.   asm("pusha
  2070.        push %ds
  2071.        pop  %es
  2072.        movl _umk_src,%esi
  2073.        movl _umk_dst,%edi
  2074.        movb _umk_wid,%dl
  2075.        movb _umk_hgt,%dh
  2076.        movl _umk_caddr,%ebx
  2077.        xorl %eax,%eax
  2078.        xorl %ecx,%ecx
  2079. faloop1:
  2080.        cmpb $0,%dl
  2081.        jz   falinedone
  2082.        movb %ds:(%esi),%al
  2083.        incl %esi
  2084.        cmpb $0,%al
  2085.        jnz  fanonzero
  2086.        movb %ds:(%esi),%al
  2087.        incl %esi
  2088.        subb %al,%dl
  2089.        subl %eax,%edi
  2090.        jmp  faloop1
  2091. fanonzero:
  2092.        cmpl _umk_xmax,%edi
  2093.        ja   fadontplot
  2094.        cmpl _umk_xmin,%edi
  2095.        jb   fadontplot
  2096.        cmpb $0,_umk_flag
  2097.        jnz  fadontplot
  2098.        movb %ds:(%ebx,%eax),%al
  2099.        movb %al,%es:(%edi)
  2100. fadontplot:
  2101.        decl %edi
  2102.        decb %dl
  2103.        jmp  faloop1
  2104. falinedone:
  2105.        decb %dh
  2106.        jz   fadone
  2107.        movb _umk_wid,%al
  2108.        movw $320,%cx
  2109.        addw %ax,%cx
  2110.        addl %ecx,%edi
  2111.        movb %al,%dl
  2112.        cmpb $0,_umk_flag
  2113.        jnz  fabfhandle
  2114.        addl $320,_umk_xmin
  2115.        addl $320,_umk_xmax
  2116.        jmp  faloop1
  2117. fabfhandle:
  2118.        decb _umk_flag
  2119.        jmp  faloop1
  2120. fadone:
  2121.        popa");
  2122. }
  2123.  
  2124. /* does not handle boxes wider than 255 pixels */
  2125. void shadowbox(int x,int y,int x2,int y2,scrntype scrn,colmat c)
  2126. {
  2127.   umk_src=(long)c;
  2128.   umk_dst=(long)scrn+x+y*320;
  2129.   umk_wid=x2-x+1;
  2130.   umk_hgt=y2-y+1;
  2131.   umk_caddr=320-umk_wid;
  2132.   asm("pusha
  2133.        push %ds
  2134.        pop  %es
  2135.        movl _umk_src,%esi
  2136.        movl _umk_dst,%edi
  2137.        movb _umk_wid,%dl
  2138.        movb _umk_hgt,%dh
  2139.        movl _umk_caddr,%ebx
  2140.        xorl %eax,%eax
  2141. sbloop1:
  2142.        cmpb $0,%dl
  2143.        jz sblinedone
  2144.        movb %es:(%edi),%al
  2145.        movb %ds:(%esi,%eax),%al
  2146.        movb %al,%es:(%edi)
  2147.        incl %edi
  2148.        decb %dl
  2149.        jmp  sbloop1
  2150. sblinedone:
  2151.        decb %dh
  2152.        jz   sbdone
  2153.        addl %ebx,%edi
  2154.        movb _umk_wid,%dl
  2155.        jmp  sbloop1
  2156. sbdone:
  2157.        popa");
  2158. }
  2159.  
  2160. void shadowscr(scrntype scrn,colmat c)
  2161. {
  2162.   umk_src=(long)c;
  2163.   umk_dst=(long)scrn;
  2164.   asm("pusha
  2165.        push %ds
  2166.        pop  %es
  2167.        movl _umk_src,%esi
  2168.        movl _umk_dst,%edi
  2169.        movw $64000,%cx
  2170.        xorl %eax,%eax
  2171. ssloop1:
  2172.        movb %es:(%edi),%al
  2173.        movb %ds:(%esi,%eax),%al
  2174.        movb %al,%es:(%edi)
  2175.        incl %edi
  2176.        decw %cx
  2177.        jnz  ssloop1
  2178.        popa");
  2179. }
  2180.  
  2181.